import glob
import pandas as pd
import os
import shutil


# 项目需求2：将需求1中分类完成的文件进行合并，合并时去除空文件。其中有关PM25的文件需进行二次分类。
def Merge():
    # 源文件目录差异化部分
    filelist = [
        "DMYS",
        "DMYS-HF",
        "H500",
        "PLAM-HF",
        "PM25",
        "PM25"
    ]
    pattern = [
        "-[0-9]*",
        "*",
        "-[0-9]*",
        "*",
        "-[0-9]*",
        "-[0-9]*"
    ]
    path = "C:/Users/24350/IdeaProjects/Meteorological_BigData/initialdata"  # 源文件目录公共部分
    for flag in range(1, 7):  # 遍历6个文件夹
        files = glob.glob(
            path + str(flag) + "/" + filelist[flag - 1] + pattern[flag - 1] + ".TXT")  # 获取同类文件夹中的所有文件，并存为文件列表
        if flag == 5:  # 在第五个同类文件夹中有特殊情况，一部分文件有12列，另一部分有13列。将有13列的文件移动到编号为initialdata6的文件夹中（项目要求）
            for f in files:  # 遍历文件列表
                df = pd.read_table(f, sep="\s+", skiprows=[0], encoding="GBK")  # 读文件
                if df.shape[1] != 12:
                    os.makedirs(path + str(flag + 1), exist_ok=True)  # 如果文件夹initialdata6不存在就创建
                    shutil.move(f, path + str(flag + 1))  # 移动有13列的文件到文件夹initialdata6
        i = 1
        for file in files:  # 遍历文件列表
            try:  # 抛异常：抛出空白文件
                d = pd.read_table(file, sep="\s+", encoding="GBK")  # 用于读取文件中的时间，并赋值给另一个dataframe
                df = pd.read_table(file, sep="\s+", header=1, encoding="GBK")  # 按照文件中的第二行初始化
                df["year"] = list(d)[0]
                df["month"] = list(d)[1]
                df["day"] = list(d)[2]
                df["hour"] = str(list(d)[3])[:2]  # 目录initialdata4里，有部分文件的时间跟着字符串，这里取字符串前三个字符，将不属于时间的字符剔除
                if i == 1:  # 如果是同类文件列表里的第一个，则保存列名。否则，不保存列名。
                    df.to_csv(path + str(flag) + "/" + filelist[flag - 1] + ".txt", mode="a+",
                              sep="\t", index=False, header=True)
                    i += 1
                else:
                    df.to_csv(path + str(flag) + "/" + filelist[flag - 1] + ".txt", mode="a+",
                              sep="\t", index=False, header=False)
            except Exception as e:
                pass
            continue


if __name__ == '__main__':
    Merge()